+2007-06-05 Kristian Rietveld <kris@gtk.org>
+
+ Fix #399071, suggestion from Benoit Dejean.
+
+ * gtk/gtkliststore.[ch] (gtk_list_store_set_vector_internal): new
+ function, factored out code iterating (columns, values) vectors from
+ gtk_list_store_new_with_valuesv to here,
+ (gtk_list_store_set_valuesv): new public function to set list store
+ values using (columns, values) vectors,
+ (gtk_list_store_new_with_valuesv): call new _set_vector_internal
+ instead.
+
+ * gtk/gtktreestore.[ch] (gtk_tree_store_set_vector_internal),
+ (gtk_tree_store_set_valuesv), (gtk_tree_store_new_with_valuesv):
+ likewise.
+
+ * gtk/gtk.symbols: updated.
+
2007-06-04 Richard Hult <richard@imendio.com>
* gdk/quartz/gdkwindow-quartz.c:
gtk_list_store_set_column_types
gtk_list_store_set_valist
gtk_list_store_set_value
+gtk_list_store_set_valuesv
gtk_list_store_swap
#endif
#endif
gtk_tree_store_set_column_types
gtk_tree_store_set_valist
gtk_tree_store_set_value
+gtk_tree_store_set_valuesv
gtk_tree_store_swap
#endif
#endif
return func;
}
+static void
+gtk_list_store_set_vector_internal (GtkListStore *list_store,
+ GtkTreeIter *iter,
+ gboolean *emit_signal,
+ gboolean *maybe_need_sort,
+ gint *columns,
+ GValue *values,
+ gint n_values)
+{
+ gint i;
+ GtkTreeIterCompareFunc func = NULL;
+
+ func = gtk_list_store_get_compare_func (list_store);
+ if (func != _gtk_tree_data_list_compare_func)
+ *maybe_need_sort = TRUE;
+
+ for (i = 0; i < n_values; i++)
+ {
+ *emit_signal = gtk_list_store_real_set_value (list_store,
+ iter,
+ columns[i],
+ &values[i],
+ FALSE) || *emit_signal;
+
+ if (func == _gtk_tree_data_list_compare_func &&
+ columns[i] == list_store->sort_column_id)
+ *maybe_need_sort = TRUE;
+ }
+}
+
static void
gtk_list_store_set_valist_internal (GtkListStore *list_store,
GtkTreeIter *iter,
}
}
+/**
+ * gtk_list_store_set_valuesv:
+ * @list_store: A #GtkListStore
+ * @iter: A valid #GtkTreeIter for the row being modified
+ * @columns: an array of column numbers
+ * @values: an array of GValues
+ * @n_values: the length of the @columns and @values arrays
+ *
+ * A variant of gtk_list_store_set_valist() which
+ * takes the columns and values as two arrays, instead of
+ * varargs. This function is mainly intended for
+ * language-bindings and in case the number of columns to
+ * change is not known until run-time.
+ *
+ * Since: 2.12
+ */
+void
+gtk_list_store_set_valuesv (GtkListStore *list_store,
+ GtkTreeIter *iter,
+ gint *columns,
+ GValue *values,
+ gint n_values)
+{
+ gboolean emit_signal = FALSE;
+ gboolean maybe_need_sort = FALSE;
+
+ g_return_if_fail (GTK_IS_LIST_STORE (list_store));
+ g_return_if_fail (VALID_ITER (iter, list_store));
+
+ gtk_list_store_set_vector_internal (list_store, iter,
+ &emit_signal,
+ &maybe_need_sort,
+ columns, values, n_values);
+
+ if (maybe_need_sort && GTK_LIST_STORE_IS_SORTED (list_store))
+ gtk_list_store_sort_iter_changed (list_store, iter, list_store->sort_column_id);
+
+ if (emit_signal)
+ {
+ GtkTreePath *path;
+
+ path = gtk_list_store_get_path (GTK_TREE_MODEL (list_store), iter);
+ gtk_tree_model_row_changed (GTK_TREE_MODEL (list_store), path, iter);
+ gtk_tree_path_free (path);
+ }
+}
+
/**
* gtk_list_store_set_valist:
* @list_store: A #GtkListStore
gint length;
gboolean changed = FALSE;
gboolean maybe_need_sort = FALSE;
- GtkTreeIterCompareFunc func = NULL;
- gint i;
/* FIXME refactor to reduce overlap with
* gtk_list_store_insert_with_values()
list_store->length++;
- func = gtk_list_store_get_compare_func (list_store);
- if (func != _gtk_tree_data_list_compare_func)
- maybe_need_sort = TRUE;
-
- for (i = 0; i < n_values; i++)
- {
- changed = gtk_list_store_real_set_value (list_store,
- iter,
- columns[i],
- &values[i],
- FALSE) || changed;
-
- if (func == _gtk_tree_data_list_compare_func &&
- columns[i] == list_store->sort_column_id)
- maybe_need_sort = TRUE;
- }
+ gtk_list_store_set_vector_internal (list_store, iter,
+ &changed, &maybe_need_sort,
+ columns, values, n_values);
/* Don't emit rows_reordered here */
if (maybe_need_sort && GTK_LIST_STORE_IS_SORTED (list_store))
void gtk_list_store_set (GtkListStore *list_store,
GtkTreeIter *iter,
...);
+void gtk_list_store_set_valuesv (GtkListStore *list_store,
+ GtkTreeIter *iter,
+ gint *columns,
+ GValue *values,
+ gint n_values);
void gtk_list_store_set_valist (GtkListStore *list_store,
GtkTreeIter *iter,
va_list var_args);
return func;
}
+static void
+gtk_tree_store_set_vector_internal (GtkTreeStore *tree_store,
+ GtkTreeIter *iter,
+ gboolean *emit_signal,
+ gboolean *maybe_need_sort,
+ gint *columns,
+ GValue *values,
+ gint n_values)
+{
+ gint i;
+ GtkTreeIterCompareFunc func = NULL;
+
+ func = gtk_tree_store_get_compare_func (tree_store);
+ if (func != _gtk_tree_data_list_compare_func)
+ *maybe_need_sort = TRUE;
+
+ for (i = 0; i < n_values; i++)
+ {
+ *emit_signal = gtk_tree_store_real_set_value (tree_store, iter,
+ columns[i], &values[i],
+ FALSE) || *emit_signal;
+
+ if (func == _gtk_tree_data_list_compare_func &&
+ columns[i] == tree_store->sort_column_id)
+ *maybe_need_sort = TRUE;
+ }
+}
+
static void
gtk_tree_store_set_valist_internal (GtkTreeStore *tree_store,
GtkTreeIter *iter,
}
}
+/**
+ * gtk_tree_store_set_valuesv:
+ * @tree_store: A #GtkTreeStore
+ * @iter: A valid #GtkTreeIter for the row being modified
+ * @columns: an array of column numbers
+ * @values: an array of GValues
+ * @n_values: the length of the @columns and @values arrays
+ *
+ * A variant of gtk_tree_store_set_valist() which takes
+ * the columns and values as two arrays, instead of varargs. This
+ * function is mainly intended for language bindings or in case
+ * the number of columns to change is not known until run-time.
+ *
+ * Since: 2.12
+ **/
+void
+gtk_tree_store_set_valuesv (GtkTreeStore *tree_store,
+ GtkTreeIter *iter,
+ gint *columns,
+ GValue *values,
+ gint n_values)
+{
+ gboolean emit_signal = FALSE;
+ gboolean maybe_need_sort = FALSE;
+
+ g_return_if_fail (GTK_IS_TREE_STORE (tree_store));
+ g_return_if_fail (VALID_ITER (iter, tree_store));
+
+ gtk_tree_store_set_vector_internal (tree_store, iter,
+ &emit_signal,
+ &maybe_need_sort,
+ columns, values, n_values);
+
+ if (maybe_need_sort && GTK_TREE_STORE_IS_SORTED (tree_store))
+ gtk_tree_store_sort_iter_changed (tree_store, iter, tree_store->sort_column_id, TRUE);
+
+ if (emit_signal)
+ {
+ GtkTreePath *path;
+
+ path = gtk_tree_store_get_path (GTK_TREE_MODEL (tree_store), iter);
+ gtk_tree_model_row_changed (GTK_TREE_MODEL (tree_store), path, iter);
+ gtk_tree_path_free (path);
+ }
+}
+
/**
* gtk_tree_store_set_valist:
* @tree_store: A #GtkTreeStore
GtkTreeIter tmp_iter;
gboolean changed = FALSE;
gboolean maybe_need_sort = FALSE;
- GtkTreeIterCompareFunc func = NULL;
- gint i;
g_return_if_fail (GTK_IS_TREE_STORE (tree_store));
iter->user_data = new_node;
g_node_insert (parent_node, position, new_node);
- func = gtk_tree_store_get_compare_func (tree_store);
- if (func != _gtk_tree_data_list_compare_func)
- maybe_need_sort = TRUE;
-
- for (i = 0; i < n_values; i++)
- {
- changed = gtk_tree_store_real_set_value (tree_store, iter,
- columns[i], &values[i],
- FALSE) || changed;
-
- if (func == _gtk_tree_data_list_compare_func &&
- columns[i] == tree_store->sort_column_id)
- maybe_need_sort = TRUE;
- }
+ gtk_tree_store_set_vector_internal (tree_store, iter,
+ &changed, &maybe_need_sort,
+ columns, values, n_values);
if (maybe_need_sort && GTK_TREE_STORE_IS_SORTED (tree_store))
gtk_tree_store_sort_iter_changed (tree_store, iter, tree_store->sort_column_id, FALSE);
void gtk_tree_store_set (GtkTreeStore *tree_store,
GtkTreeIter *iter,
...);
+void gtk_tree_store_set_valuesv (GtkTreeStore *tree_store,
+ GtkTreeIter *iter,
+ gint *columns,
+ GValue *values,
+ gint n_values);
void gtk_tree_store_set_valist (GtkTreeStore *tree_store,
GtkTreeIter *iter,
va_list var_args);